class Helper(object):
    """docstring for Helper"""
    def __init__(self, arg):
        super(Helper, self).__init__()
        self.arg = arg

    names = 'hahah'

    # 静态方法的注解；
    # 静态方法的参数，第一个已经不再是 self了，也就是不会再传递进去了。
    @staticmethod
    def go(*args,**keyargs):
        print(args)
        print(keyargs)
        print(Helper.names)

    # 类方法；也只能访问类的属性，无法访问实例属性。
    # 和静态方法不同点是：可以传递第一个参数 self，代表类本身；
    # 如下，
    # 当不传递 self 时，打印 args：(<class '__main__.Helper'>, 1, 2)；
    #   此时只能使用类名来访问类的属性；
    # 当传递了 self 时，打印 args：(1, 2)；
    #   此时可以使用 self 来访问类的属性；
    @classmethod
    def go1(*args,**keyargs):
        print(args)
        print(keyargs)
        print(Helper.names)

    def go2(self, *args,**keyargs):
        print(args)
        print(keyargs)
        print(self.names)# 非静态方法内，实例本身没有 names 属性，那么 self.names 就可以访问到类的 name 属性。

    # 属性方法，就是把方法当做属性一样处理；
    # 此时，应该没法传递参数，因为视为属性来用，就没有 () 了。
    # 属性方法无法通过del方式删除：del h.color，需要配合 @color.deleter；
    @property
    def color(self):
        print("%s" % self.arg)
        return self.arg
    # 给属性赋值
    @color.setter
    def color(self, c):
        print("%s" % c)
        self.arg = c
    # 删除属性，还是需要 del 来触发此方法。
    @color.deleter
    def color(self):
        print("delete attr color")
        del self.arg



# 类直接调用静态方法。
Helper.go(1, 2, aa=11, bb=2)
Helper.go1(1, 2, aa=11, bb=2)

# 实例也能调用静态方法，但参数是必须的。
h = Helper(1)
h.go(1, 2, aa=11, bb=2)
h.go2(1, 2, aa=11, bb=2)

'''
访问不存在的属性，会报异常：
Traceback (most recent call last):
  File ".\module123\class-static.py", line 64, in <module>
    print(h.color2)
AttributeError: 'Helper' object has no attribute 'color2'
'''
print(h.color2)

print(h.color)
h.color = 3
print(h.color)


del h.color


# print(h.color)
# h.color = 3
# print(h.color)